package GestionDeDatos;

import java.util.ArrayList;

import javax.xml.soap.SOAPException;

import Excepciones.*;
import Filtros.FiltroAmigo;
import Filtros.FiltroCurso;
import Filtros.FiltroDia;
import Filtros.FiltroHora;
import Filtros.FiltroSede;
import InfoCliente.*;

public class GestorBD {
	
	private static GestorBD instancia = null;
	
	private AdministradorBD administrador;
	private ConsultorBD consultor;
	
	public static GestorBD Gestor() throws SOAPException {
		
		if (instancia != null) return instancia;
		
		instancia = new GestorBD();
		return instancia;
	}
	
	private GestorBD() {

		administrador = new AdministradorBD();
		consultor = new ConsultorBD();
	}
	
	public void CrearNuevoUsuario(Usuario usuario) throws SOAPException, ExistentUserException, 
			DatabaseException, CheckException, UpdateException {
		
		administrador.CrearNuevoUsuario(usuario);        
	}
	
	public void EliminarUsuario(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, UpdateException {
		
		administrador.EliminarUsuario(usuario);
	}
	
	public void EnviarSolicitud(UsuarioActivo usuarioPide, Solicitud solicitud) throws SOAPException, 
			InvalidLogInException, InvalidFriendshipRequestException, InexistentUserException, 
			ExistentFriendshipRequestException, ExistentFriendshipException, DatabaseException, CheckException, UpdateException {
		
		administrador.EnviarSolicitud(usuarioPide, solicitud);
	}
	
	public void ConfirmarAmistad(UsuarioActivo usuarioConfirma, Amistad amistad) throws SOAPException, 
			InvalidLogInException, InvalidFriendshipException, InexistentUserException, 
			InexistentFriendshipRequestException, ExistentFriendshipException, DatabaseException, CheckException, UpdateException {
		
		administrador.ConfirmarAmistad(usuarioConfirma, amistad);
	}
	
	public void DeclinarSolicitud(UsuarioActivo usuarioDeclina, Solicitud solicitud) throws SOAPException, 
			InvalidLogInException, InvalidFriendshipRequestException, InexistentUserException, 
			InexistentFriendshipRequestException, DatabaseException, CheckException, UpdateException {
		
		administrador.DeclinarSolicitud(usuarioDeclina, solicitud);
	}
	
	public void DeshacerAmistad(UsuarioActivo usuarioDeshace, Amistad amistad) throws SOAPException, 
			InvalidLogInException, InvalidFriendshipException, InexistentUserException, 
			InexistentFriendshipException, DatabaseException, CheckException, UpdateException {
		
		administrador.DeshacerAmistad(usuarioDeshace, amistad);
	}
	
	public void RealizarInscripcion(UsuarioActivo usuario, Inscripcion inscripcion) throws SOAPException, 
			InvalidLogInException, InvalidInscriptionException, InexistentSubjectException, 
			ExistentInscriptionException, DatabaseException, CheckException, UpdateException {
		
		administrador.RealizarInscripcion(usuario, inscripcion);
	}
	
	public void DeshacerInscripcion(UsuarioActivo usuario, Inscripcion inscripcion) throws SOAPException, 
			InvalidLogInException, InvalidInscriptionException, InexistentSubjectException, 
			InexistentInscriptionException, DatabaseException, CheckException, UpdateException {
		
		administrador.DeshacerInscripcion(usuario, inscripcion);
	}
	
	public void IniciarSesion(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException {
		
		consultor.IniciarSesion(usuario);
	}
	
	public void CerrarSesion(UsuarioActivo usuario) {
		
		consultor.CerrarSesion(usuario);
	}
	
	public ResultadoConsulta ObtenerDepartamentos(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {

		return consultor.ObtenerDepartamentos(usuario);
	}
		
	public ResultadoConsulta ObtenerMaterias(UsuarioActivo usuario, Integer departamento) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		return consultor.ObtenerMaterias(usuario, departamento);
	}
		
	public ResultadoConsulta ObtenerCursos(UsuarioActivo usuario, Integer departamento, Integer materia) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		return consultor.ObtenerCursos(usuario, departamento, materia);
	}
		
	public ResultadoConsulta ObtenerHorarios(UsuarioActivo usuario, Integer departamento, Integer materia, String curso) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
	
		return consultor.ObtenerHorarios(usuario, departamento, materia, curso);
	}
	
	public ResultadoConsulta ObtenerInscripciones(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		return consultor.ObtenerInscripciones(usuario);
	}
	
	public ResultadoConsulta ObtenerSolicitudes(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		return consultor.ObtenerSolicitudes(usuario);
	}
	
	public ResultadoConsulta ObtenerAmistades(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		return consultor.ObtenerAmistades(usuario);
	}
	
	public ResultadoConsulta ConsultarPorFiltro(UsuarioActivo usuario, ArrayList<FiltroCurso> cursos, 
			ArrayList<FiltroAmigo> amigos, ArrayList<FiltroSede> sedes, ArrayList<FiltroDia> dias, 
			ArrayList<FiltroHora> horas) throws SOAPException, 
			InvalidLogInException, DatabaseException, CheckException, QueryException {
		
		return consultor.ConsultarPorFiltro(usuario, cursos, amigos, sedes, dias, horas);
	}
}
